
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>分布式缓存的原理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>分布式缓存的原理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">分布式缓存主要解决了哪些问题？或者说，它在系统中扮演了哪三个主要作用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">1. 提高数据访问速度：通过缓存常用数据，减少对数据库等慢速存储的查询操作。2. 降低数据库压力：减少对数据库的直接访问，缓解高并发压力，提升系统吞吐量。3. 优化系统性能：通过缓存热点数据和实现流量负载均衡来显著提升系统性能。</div>
          </div>
          <div class="card-source">来源: 分布式缓存的基本概念 -> 1. 缓存的定义与作用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">问题</div>
          <div class="card-question">请解释缓存击穿（Cache Breakdown）与缓存穿透（Cache Penetration）之间的区别。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">问题</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">缓存击穿指的是某个热点数据的缓存突然失效，此时大量并发请求访问这个数据，导致所有请求都直接访问数据库。缓存穿透则指的是请求的数据在缓存和数据库中都不存在，导致这些无效请求每次都会穿过缓存直接访问数据库。</div>
          </div>
          <div class="card-source">来源: 分布式缓存的常见问题 -> 3. 缓存穿透 & 4. 缓存击穿</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">什么是缓存雪崩（Cache Avalanche），以及如何通过设置过期时间来缓解这个问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">缓存雪崩是指大量缓存数据在同一时间过期，导致大量请求直接访问数据库，瞬间增加数据库压力。一种解决方案是缓存过期时间随机化，即给每个缓存数据设置不同的过期时间，从而避免大量缓存同时过期。</div>
          </div>
          <div class="card-source">来源: 分布式缓存的常见问题 -> 2. 缓存雪崩</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">分布式缓存的“写入时更新 (Write-through)”和“延迟写入 (Write-behind)”这两种更新策略有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“写入时更新 (Write-through)”策略在数据写入缓存的同时，会立即将数据同步写入数据库，这确保了数据的一致性但可能导致较高的写入延迟。“延迟写入 (Write-behind)”策略在写入缓存时不会立即更新数据库，而是通过后台线程批量更新，这提高了写入性能，但可能存在数据丢失的风险和短暂的数据不一致。</div>
          </div>
          <div class="card-source">来源: 分布式缓存的架构设计 -> 2.2 缓存更新策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">根据文档，Redis 和 Memcached 在数据结构支持和持久化机制方面的主要区别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis 支持丰富的数据结构（如字符串、哈希、列表、集合等），并提供 RDB（快照）和 AOF（追加日志）两种持久化方式。相比之下，Memcached 只支持简单的键值对字符串存储，且没有持久化机制，服务重启后数据会丢失。</div>
          </div>
          <div class="card-source">来源: 常见的分布式缓存技术 -> 1. Redis & 2. Memcached</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">分布式缓存系统为了实现高可用性，通常采用哪两种关键技术？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">为了实现高可用性，分布式缓存系统通常采用两种关键技术：1. 数据复制（Data Replication），即将数据在多个节点间复制，确保某个节点故障时数据依然可用。2. 故障转移（Failover），即在节点发生故障时，系统能自动切换到健康的节点，保证服务的持续性。</div>
          </div>
          <div class="card-source">来源: 分布式缓存的架构设计 -> 2.4 高可用性设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">文档中提到了哪三种常见的缓存失效（或淘汰）策略？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到的三种常见缓存失效策略是：1. LRU（Least Recently Used），移除最久未使用的缓存数据。2. LFU（Least Frequently Used），移除访问频率最低的数据。3. TTL（Time-to-Live），为缓存设置过期时间，到期后自动移除。</div>
          </div>
          <div class="card-source">来源: 分布式缓存的架构设计 -> 2.2 缓存更新策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">布隆过滤器（Bloom Filter）是如何帮助解决缓存穿透问题的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">布隆过滤器可以用来预先判断一个请求的键是否存在于数据库中。如果布隆过滤器判断某个键不存在，就可以直接拦截该请求，避免其访问数据库。这样可以有效防止对不存在的数据的频繁查询穿透缓存层，从而保护数据库。</div>
          </div>
          <div class="card-source">来源: 分布式缓存的常见问题 -> 3. 缓存穿透</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在分布式缓存中，数据一致性通常分为哪两种方案？它们分别适用于什么场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">数据一致性通常分为两种方案：1. 强一致性（Strong Consistency），确保缓存与数据源的数据时刻保持一致，适用于对一致性要求极高的场景。2. 最终一致性（Eventual Consistency），允许缓存与数据源之间存在短暂的数据不一致，但保证在合理时间内最终会同步，适用于对性能要求高而一致性要求相对较低的场景。</div>
          </div>
          <div class="card-source">来源: 分布式缓存的基本概念 -> 2. 分布式缓存的工作原理</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
